using System;

namespace org.synthful.Number
{
    public class DoubleValue
    {
        /// <summary>
        /// Offered under Apache Public Licence 2.0
        /// synthful.org
        /// blessedgeek [@] synthful.org
        /// </summary>
        public DoubleValue(double i)
        {
            Value = i;
        }

        public double Value;

        public static implicit operator Int64(DoubleValue V)
        {
            return Convert.ToInt64(V.Value);
        }
        public static implicit operator int(DoubleValue V)
        {
            return Convert.ToInt32(V.Value);
        }
        public static implicit operator float(DoubleValue V)
        {
            return Convert.ToSingle(V.Value);
        }
        public static implicit operator double(DoubleValue V)
        {
            return V.Value;
        }
        public static implicit operator DoubleValue(double i)
        {
            return new DoubleValue(i);
        }

        public static implicit operator DoubleValue(int i)
        {
            return new DoubleValue(i);
        }

        public static DoubleValue operator -(DoubleValue V, int i)
        {
            return new DoubleValue(V.Value - i);
        }
        public static DoubleValue operator +(DoubleValue V, int i)
        {
            return new DoubleValue(V.Value + i);
        }

        public static DoubleValue operator -(DoubleValue V, double i)
        {
            return new DoubleValue(V.Value - i);
        }
        public static DoubleValue operator +(DoubleValue V, double i)
        {
            return new DoubleValue(V.Value + i);
        }

        public static DoubleValue operator --(DoubleValue V)
        {
            V.Value--;
            return V;
        }
        public static DoubleValue operator ++(DoubleValue V)
        {
            V.Value++;
            return V;
        }

        public static bool operator >(DoubleValue V, int i)
        {
            return V.Value > i;
        }
        public static bool operator <(DoubleValue V, int i)
        {
            return V.Value < i;
        }

        public static bool operator >=(DoubleValue V, int i)
        {
            return V.Value >= i;
        }
        public static bool operator <=(DoubleValue V, int i)
        {
            return V.Value <= i;
        }

        public static bool operator >(DoubleValue V, double i)
        {
            return V.Value > i;
        }
        public static bool operator <(DoubleValue V, double i)
        {
            return V.Value < i;
        }

        public static bool operator >=(DoubleValue V, double i)
        {
            return V.Value >= i;
        }
        public static bool operator <=(DoubleValue V, double i)
        {
            return V.Value <= i;
        }

        public string toString()
        {
            return Value.ToString();
        }
        public string toString(IFormatProvider ifp)
        {
            return Value.ToString(ifp);
        }
        public string toString(string format)
        {
            return Value.ToString(format);
        }
        public string toString(string format, IFormatProvider ifp)
        {
            return Value.ToString(format, ifp);
        }
    }
}
